package main

import (
	"bloomfilter/hash"
	"bloomfilter/mybitmap"
	"fmt"
)

// MyBloomFilter 自定义布隆过滤器
type MyBloomFilter struct {
	bitMap    mybitmap.MyBitMap // 自定义位图
	hashArray [3]hash.HashFunc  // 自定义哈希函数数组
	seeds     [3]int            // 随机数种子
	usedSize  int               // 存储元素个数
}

// InitBloomFilter 初始化布隆过滤器函数
func InitBloomFilter() *MyBloomFilter {
	var bloomFilter MyBloomFilter
	bloomFilter.bitMap = *mybitmap.InitBitMap()
	bloomFilter.seeds = [3]int{11, 22, 33}
	bloomFilter.usedSize = 0
	for i := 0; i < 3; i++ {
		bloomFilter.hashArray[i] = *hash.InitHashFunc(100, bloomFilter.seeds[i])
	}
	return &bloomFilter
}

// Insert 插入值到布隆过滤器当中
func (bloomFilter *MyBloomFilter) Insert(key string) {
	// 分别计算三个哈希函数计算值
	for i := 0; i < len(bloomFilter.hashArray); i++ {
		value := bloomFilter.hashArray[i].Hash(key)
		// 插入到位图中
		bloomFilter.bitMap.Set(value)
	}
}

// MightContain 从布隆过滤器中查询元素
func (bloomFilter *MyBloomFilter) MightContain(key string) bool {
	// 分别计算三个哈希函数对应值
	for i := 0; i < len(bloomFilter.hashArray); i++ {
		value := bloomFilter.hashArray[i].Hash(key)
		// 判断值是否为0
		if !bloomFilter.bitMap.Get(value) {
			return false
		}
	}
	// 全部为1判断为存在（存在误判可能）
	return true
}

func main() {
	var bloomFilter = InitBloomFilter()
	// 插入数据
	bloomFilter.Insert("DiDi")
	bloomFilter.Insert("baidu")
	fmt.Println(bloomFilter.bitMap)
	// 查询元素
	fmt.Println(bloomFilter.MightContain("DiDi"))
	fmt.Println(bloomFilter.MightContain("baidu"))
	fmt.Println(bloomFilter.MightContain("tencent"))
	fmt.Println(bloomFilter.MightContain("alibaba"))
}
